package ch02.LL_K_Parser;

import ch02.LL_K_Parser.Lexer;
import ch02.LL_1_Lexer.Token;

public class Parser {
    Lexer input;                // 待处理词法单元的来源
    Token[] lookahead;          // 环形缓冲区

    int k;                      // 向前看符号的个数
    int p = 0;                  // 环形缓冲区中装填下一个词法单元的位置

    public Parser(ch02.LL_K_Parser.Lexer input, int k) {
        this.input = input;
        this.k = k;
        lookahead = new Token[k];
        for (int i = 0; i < k; i++) {
            consume();
        }
    }


    public void consume() {
        lookahead[p] = input.nextToken();       // 在下一个位置上放入词法单元
        p = (p + 1) % k;                        // 自增下标
    }


    /**
     * 在固定向前看个数k的情况下返回某个向前看词法单元
     * @param i
     * @return
     */
    public Token LT(int i) {
        return lookahead[(p + i - 1) % k];
    }

    /**
     * 返回k个向前看词法单元的类型
     * @param i
     * @return
     */
    public int LA(int i) {
        return LT(i).type;
    }

    public void match(int x) {
        if (LA(1) == x) {
            consume();
        } else {
            throw new Error("expecting " + input.getTokenName(x) + "; found " + LT(1));
        }
    }
}
